/**
 * 链式邻接表不仅可以存储边的基本信息，与前面的数据不同的是，还可以存储相应的编号信息
 * 边集数组 e[i] 存储起点、终点和权值信息 {u, v, w}
 * 表头数组 h[u][i] 用来存储 u 的所有出边的编号
 * 时间复杂度：O(n + m)
 * 空间复杂度: O(n + m)
 * 应用范围：适用于各种图
 */
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 40007;

struct Edge {
  int u, v, w;
};

// n 代表点数，m 代表边数
int n, m;
// 边集数组
vector<Edge> e;
// 表头数组
vector<int> h[MAX];

/**
 * @brief 添加边集数组，这里我们假设边的序号为从 1 开始的递增序列
 */
void add(int u, int v, int w) {
  e.push_back({u, v, w});
  h[u].push_back(e.size() - 1);
}

/**
 * @brief dfs 深搜算法
 *
 * @param u 当前边的始点
 * @param fa  父节点（或者说是递归的上一次边的始点）
 */
void dfs(int u, int fa) {
  for (auto i : h[u]) {
    int v = e[i].v, w = e[i].w;
    if (v == fa)
      continue;
    cout << u << ", " << v << ", " << w << endl;
    dfs(v, u);
  }
}

int main() {
  int u, v, w;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    cin >> u >> v >> w;
    add(u, v, w);
    add(v, u, w);
  }

  dfs(1, 0);

  return 0;
}